<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        //    发布订阅
        // 原始的做法
        //    假如饿了去楼下买包子，包子没做好，就回来了
        //    过10分钟又去了  看有没有做好
        //    。。。

        // 改善
        //     假如张三饿了去楼下买包子，包子每做好，  留下顾客的联系方式       订阅
        //     假如李四饿了去楼下买包子，包子每做好，  留下顾客的联系方式       订阅

        //     等到包子做好了   就统一联系         发布消息



        // [
        //     {
        //         user,
        //         type
        //         fn
        //     },
        //     {
        //         user,
        //         type
        //         fn
        //     },
        //     {
        //         user,
        //         type
        //         fn
        //     },
        // ]



        // [
        //     {
        //         user,
        //         info: [
        //             {
        //                 type,
        //                 fn
        //             },
        //             {
        //                 type,
        //                 fn
        //             }
        //         ]
        //     },
        //     {
        //         user,
        //         info: [
        //             {
        //                 type,
        //                 fn
        //             },
        //             {
        //                 type,
        //                 fn
        //             }
        //         ]
        //     },
        // ]


        class BaoZi {
            constructor(name) {
                this.name = name;
                this.msg = [];
            }

            // 谁订了什么包子
            add(user, type, fn) {
                // 判断这个人有没有定过
                const res = this.msg.filter(item => item.user === user)[0];  // 拿到对象
                if (res) {   // 说明这个人定过
                    // 有没有定过豆沙包
                    if (res.info.some(item => item.type === type)) {

                        return
                    }
                    else {
                        // res.info 改变了   msg也跟着改变了？？？？？
                        // res指向了msg中的某一个地址   --- 共享地址的
                        res.info.push({ type, fn })
                    }
                }
                else {
                    this.msg.push({
                        user,
                        info: [
                            {
                                type,
                                fn
                            }
                        ]
                    })
                }
            }




        }


        const s = new BaoZi('s');
        s.add('张三', '青菜包', function () {
            console.log('张三要青菜包');
        })

        s.add('张三', '豆沙包', function () {
            console.log('张三要豆沙包');
        })

        s.add('张三', '青菜包', function () {
            console.log('张三要青菜包');
        })


        s.add('李四', '青菜包', function () {
            console.log('张三要青菜包');
        })

        console.log(s.msg);




    </script>

</body>

</html>